<?php

namespace App\Http\Controllers\Admin;

use App\Http\Model\Category;
use Illuminate\Http\Request;

use App\Http\Requests;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Validator;

class CategoryController extends CommonController
{
    //GET  admin/category  文章分类的列表页面
    public function index()
    {
        $category = new Category();

        $data = $category->get_tree();

        return view('admin.category.list')->with('data', $data);
    }

    //GET  admin/category/create 添加页
    public function create()
    {
        //查询cate_pid 为0的所有顶级栏目
        $cate_list = Category::where('cate_pid','0')->get();
        return view('admin.category.add')->with('data', $cate_list);
    }

    //POST   admin/category  添加保存操作
    public function store($cate_id = 0)
    {
        //17年3月2日 统一修改 插入/更新 操作的方法
        $rs = $this->auto_save($cate_id);
        if($rs === true) {
            return redirect('admin/category');
        }elseif($rs === false) {
            return back()->with('errors', '数据填充失败，请稍后重试！');
        }else {
            return back()->withErrors($rs);
        }
    }

    //GET   admin/category/{category}  展示单条记录页
    public function show($cate_id)
    {
        return redirect('admin/category');
    }

    //GET    admin/category/{category}/edit 编辑展示页
    public function edit($cate_id)
    {
        if($cate_info = Category::find($cate_id)) {
            //查询cate_pid 为0的所有顶级栏目
            $cate_list = Category::where('cate_pid','0')->get(); //此处未扩展三级栏目
            //1.模板传递两个变量使用数组传递 或2.使用return view()->compact($cate_info,$cate_list);
            return view('admin.category.edit')->with(['cate_info' => $cate_info, 'data' => $cate_list]);
        }else {
            return redirect('admin/category');
        }
    }

    //PUT|PATCH   admin/category/{category}  更新操作
    public function update($cate_id)
    {
        //17年3月2日 统一修改 插入/更新 操作的方法
        $rs = $this->auto_save($cate_id);
        if($rs === true) {
            return redirect('admin/category');
        }elseif($rs === false) {
            return back()->with('errors', '数据填充失败，请稍后重试！');
        }else {
            return back()->withErrors($rs);
        }
    }

    //DELETE   admin/category/{category}  删除记录操作
    public function destroy($cate_id)
    {
        //1.判断如顶级，子栏目是否为空，否则不能删除
        $cate_list = Category::where('cate_pid',$cate_id)->get();
        if(count($cate_list) > 0) {
            $data = ['msg' => '子栏目不为空，不能删除', 'errno' => 1];
        }else {
            if( $rs = Category::where('cate_id', $cate_id)->delete() ) {
                $data = ['msg' => '删除成功', 'errno' => 0];
            }else {
                $data = ['msg' => '删除失败', 'errno' => 2];
            }
        }
        return $data;
    }

    /**
     * 验证插入、保存数据的方法,返回三种结果 true,false,Validator类
     * @param int $cate_id 主键id
     * @return bool | object
     */
    public function auto_save($cate_id = 0)
    {
        //3月1日 新增一条验证规则
        if(!is_numeric($cate_id)) return back()->with('errors', '数据有误请稍后重试');
        if( $input = Input::except('_token','_method') ) {
            //定义规则
            $rule = [
                'cate_pid' => 'required|integer',
                'cate_name' => 'required',
            ];
            $message = [
                'cate_pid.required' => '分类父栏目不能为空',
                'cate_pid.integer'  => '分类父栏目必须为数字',
                'cate_name.required'=> '分类栏目名称不能为空'
            ];
            $validator = Validator::make($input, $rule, $message);
            //dd($input);
            if($validator->passes()) {
                //验证通过，插入/更新 数据库
                //17年2月27日修改 更新数据调用store方便传递$cate_id参数
                if($cate_id) { //更新操作
                    $rs = Category::where('cate_id', $cate_id)->update($input);
                }else { //插入操作
                    $rs = Category::create($input);
                }
                //判断是否操作成功
                if($rs !== false) {
                    return true;
                }else {
                    return false;
                }
            }
            return $validator;
        }
    }
}